home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #21 (Jun 87) / format source / Format.a < prev    next >
Text File  |  1987-05-07  |  20KB  |  754 lines

  1. ;************************ File: Format.a ***********************
  2. ;***************************************************************
  3. ;
  4. ; A formatting program to perform low level formatting of a SCSI
  5. ; hard disk.  Allows user to enter disk drive parameters and 
  6. ; information about defects. This file contains all the standard
  7. ; code for Menus etc.  It also contains the procedures for error
  8. ; handling.
  9.  
  10.     BLANKS ON
  11.     INCLUDE        'FormatEqu.a'
  12.     LOAD        'Traps.d'
  13.     LOAD        'ToolEqu.d'
  14.     LOAD        'SysEqu.d'
  15.     LOAD        'QuickEqu.d'
  16.     LOAD        'SCSIEqu.d'
  17.     LOAD        'PackMacs.d'
  18.  
  19. ; Note Export directives must be placed before a symbol is 
  20. ; declared.
  21.  
  22.     EXPORT    (DialogBuff,QuickDraw,ButtonHit,DialogPort):DATA
  23.     EXPORT    (ItemType,ItemHandle,ItemRect,MyPort):DATA
  24.     EXPORT    (StrBuff1,StrBuff2,StrBuff3,StrBuff4):DATA
  25.     
  26. AppleMH        ds.l    1    ;handle for Apple menu
  27. FileMH        ds.l    1    ;handle for File menu
  28. EditMH        ds.l    1    ;handle for Edit menu
  29. SCSIMH        ds.l    1    ;handle for SCSI menu
  30.  
  31. DAName        ds.b    255    ;space for DA's name
  32. Window        ds.l    1
  33. DialogBuff    ds.l    DialWLen
  34. MyPort        ds.l    1
  35. ButtonHit    ds.w    1
  36. DialogPort    ds.l    1
  37. ItemType    ds.l    1
  38. ItemHandle    ds.l    1
  39. ItemRect    ds.l    2
  40. StrBuff1    ds.b    StrBuffLen
  41. StrBuff2    ds.b    StrBuffLen
  42. StrBuff3    ds.b    StrBuffLen
  43. StrBuff4    ds.b    StrBuffLen
  44.  
  45. EventRec    RECORD 20, INCR
  46. what        ds.w    1    ;
  47. Message        ds.l    1    ;
  48. When        ds.l    1    ;
  49. Point        ds.l    1    ;
  50. Modify        ds.w    1    ;
  51.             ENDR
  52.  
  53. ; Note: The space for quickdraw globals must be declared.  
  54. ; Unlike MDS, the MPW assembler does not do it for you.
  55.  
  56. QuickDraw        RECORD            ,DECREMENT
  57. thePort        ds.l    1
  58.  
  59.         ORG             -grafSize
  60.         ENDR
  61.  
  62. ; This is our program.  
  63. Begin    MAIN
  64.     ALIGN    2
  65.     IMPORT    (InitManagers,LoadMenu,InitGlobals,EventLoop):CODE
  66.                 ;we must import these symbols as they are not
  67.                 ;yet defined in this file.
  68.     
  69.     jsr        InitManagers
  70.     jsr        LoadMenu
  71.     jsr        InitGlobals
  72.     jmp        EventLoop
  73.     
  74.     ENDMAIN
  75.  
  76.  
  77. ; PROC    InitManagers
  78. ;
  79. ; Initialize all managers that we might need.
  80.  
  81. InitManagers    PROC    ENTRY
  82.     IMPORT    QuickDraw:DATA
  83.     
  84.     pea        QuickDraw.thePort(A5)
  85.     _InitGraf
  86.     _InitFonts
  87.     move.l    #AllEvents,D0
  88.     _FlushEvents
  89.     _InitWindows
  90.     _InitMenus
  91.     clr.l    -(A7)
  92.     _InitDialogs
  93.     _TEInit
  94.     _InitCursor
  95.     rts
  96.     
  97.     ENDPROC
  98.     
  99.     
  100. ; PROC    LoadMenus
  101. ;
  102. ; Subroutine called at start up time to load our menus onto the
  103. ; heap, instal them and then draw the menu bar.
  104.  
  105. LoadMenu    PROC    ENTRY
  106.  
  107.     clr.l    -(A7)
  108.     move.w    #AppleM,-(A7)        ;"About..." menu ID for Apple menu
  109.     _GetRMenu                    ;load it on heap
  110.     move.l    (A7),AppleMH(A5)    ;copy handle for future ref.
  111.     move.l    (A7),-(A7)            ;duplicate handle for the next 2 traps
  112.     clr.w    -(A7)                ;
  113.     _InsertMenu
  114.     move.l    #'DRVR',-(A7)        ;get desk accessories
  115.     _AddResMenu                    ;add to Apple Menu
  116.     
  117.     clr.l    -(A7)                ;space for next handle
  118.     move.w    #FileM,-(A7)        ;File menu ID
  119.     _GetRMenu                    ;load it on heap
  120.     move.l    (A7),FileMH(A5)        ;copy handle for future ref.
  121.     clr.w    -(A7)                ;
  122.     _InsertMenu
  123.     
  124.     clr.l    -(A7)                ;space for next handle
  125.     move.w    #EditM,-(A7)        ;Edit menu ID
  126.     _GetRMenu                    ;load it on heap
  127.     move.l    (A7),EditMH(A5)        ;copy handle for future ref.
  128.     clr.w    -(A7)                ;
  129.     _InsertMenu
  130.     
  131.     clr.l    -(A7)                ;space for next handle
  132.     move.w    #SCSIM,-(A7)        ;SCSI menu ID
  133.     _GetRMenu                    ;load it on heap
  134.     move.l    (A7),SCSIMH(A5)        ;copy handle for future ref.
  135.     clr.w    -(A7)
  136.     _InsertMenu
  137.     
  138.     _DrawMenuBar
  139.     rts
  140.     
  141.     ENDPROC
  142.  
  143.  
  144. ; PROC    EventLoop
  145. ;
  146. ; This is where we process our events.  Not much happening
  147. ; except some jump tables.  We only process mouse down events
  148. ; and system events.  All others ignored.
  149.  
  150. EventLoop    PROC    EXPORT
  151.     IMPORT    (DownMouse,DownKey,Update,Activate):CODE
  152.     
  153.     _SystemTask
  154.     clr.w    -(A7)
  155.     move.w    #EventMask,-(A7)
  156.     pea        EventRec(A5)
  157.     
  158. ; Note we unhighlight the menu only in the event loop so that 
  159. ; long opporations like formating leave the menu bar selected 
  160. ; until they have completed.
  161.     clr.w    -(A7)    
  162.     _HiLiteMenu
  163.     
  164.     _GetNextEvent
  165.     
  166.     move.w    (A7)+,D0        ;boolean for is there an event
  167.     cmp.w    #0,D0            ;if no event, loop back
  168.     beq.s    EventLoop
  169.  
  170.     movea.l    #0,A0            ;clear register for jumptable
  171.     move.w    EventRec.What(A5),A0    ;get type of event
  172.     adda.l    A0,A0            ;multipy by 2 as offset table 
  173.                                 ;contains word length entries
  174.     lea        JumpTable,A1    
  175.     adda.l    A1,A0            ;add offset to table address
  176.     adda.w    (A0),A1            ;add offset for proc to table addr.
  177.     jmp        (A1)            ;jump to procedure
  178.  
  179. JumpTable    
  180.     DATAREFS    RELATIVE
  181.     dc.w    EventLoop-JumpTable        ;event #0 - null event
  182.     dc.w    DownMouse-JumpTable        ;event #1 - mouse-down
  183.     dc.w    EventLoop-JumpTable        ;event #2 - mouse-up
  184.     dc.w    EventLoop-JumpTable        ;event #3 - key-down
  185.     dc.w    EventLoop-JumpTable        ;event #4 - key-up
  186.     dc.w    EventLoop-JumpTable        ;event #5 - auto-key
  187.     dc.w    EventLoop-JumpTable        ;event #6 - update
  188.     dc.w    EventLoop-JumpTable        ;event #7 - disk-inserted
  189.     dc.w    EventLoop-JumpTable        ;event #8 - activate
  190.     dc.w    EventLoop-JumpTable        ;event #9 - n.a.
  191.     dc.w    EventLoop-JumpTable        ;event #10 - network
  192.     dc.w    EventLoop-JumpTable        ;event #11 - device driver
  193.     dc.w    EventLoop-JumpTable        ;Appl event #1
  194.     dc.w    EventLoop-JumpTable        ;Appl event #2
  195.     dc.w    EventLoop-JumpTable        ;Appl event #3
  196.     dc.w    EventLoop-JumpTable        ;Appl event #4
  197.     ENDPROC
  198.     
  199. ; PROC    DownMouse    
  200. ;
  201. ; Procedure for handling mousedown events and figuring out which
  202. ; routine is used to handle the event.
  203.  
  204. DownMouse    PROC    Entry
  205.     IMPORT    (MenuBar,SysProc):CODE
  206.     
  207.     clr.w    -(A7)
  208.     move.l    EventRec.Point(A5),-(A7)
  209.     pea        Window(A5)
  210.     _FindWindow
  211.     movea.l    #0,A0            ;clear register 
  212.     move.w    (A7)+,A0        ;pop region number for mouse down
  213.     adda.l    A0,A0            ;multiply by two as offset table has
  214.                                 ;word entries
  215.     lea        MouseTable,A1    
  216.     adda.l    A1,A0            ;add address of table to offset
  217.     adda.w    (A0),A1            ;add offset of proc to table address
  218.     jmp        (A1)            ;jump to proc address
  219.  
  220. ; Offset table for mouse down events.
  221. MouseTable    
  222.     DATAREFS    RELATIVE
  223.     dc.w    EventLoop-MouseTable        ;in desk
  224.     dc.w    MenuBar-MouseTable            ;in menu bar
  225.     dc.w    SysProc-MouseTable            ;in system window
  226.     dc.w    EventLoop-MouseTable        ;in contents region
  227.     dc.w    EventLoop-MouseTable        ;in drag region
  228.     dc.w    EventLoop-MouseTable        ;in grow region
  229.     dc.w    EventLoop-MouseTable        ;in go away region
  230.         ENDPROC
  231.     
  232. ; PROC    MenuBar    
  233. ;
  234. ; Subroutine for jumping to the correct menu.  Put the menu 
  235. ; number in A1 and the item number in A2.  This procedure finds
  236. ; out which menu item was selected, calculated the correct 
  237. ; address to jump to and jumps there.
  238.  
  239. MenuBar    PROC    ENTRY
  240.     IMPORT    (QuitProc,UndoMI,CutMI,CopyMI,PasteMI):CODE
  241.     IMPORT    (AppleMProc,SelAddrProc,ParamProc,EDefectProc):CODE
  242.     IMPORT    (FDefectProc,FormatProc,MSenseProc,ResetProc):CODE
  243.     IMPORT    (ClearMI):CODE
  244.  
  245.     clr.w    -(A7)                ;space for longint from menu
  246.     move.l    EventRec.Point(A5),-(A7)
  247.     _MenuSelect                    ;get the menu that was selected
  248.     
  249.     movea.l    #0,A1                ;clear A1
  250.     movea.l    #0,A2                ;clear A2
  251.     move.w    (A7)+,A1            ;menu id into A1
  252.     move.w    (A7)+,A2            ;menu item into A2
  253.     
  254.     cmpa.w    #0,A1                ;movea doesn't set cond. codes
  255.     beq        eventloop            ;if menu ID=0 get another event
  256.     suba.l    #AppleM+1,A1        ;convert menu id into menu #
  257.                                     ;e.g. File menu becomes 0
  258.     cmpa.w    #$FFFF,A1            ;was it the apple menu
  259.     beq        AppleMProc            ;yes, so go handle event
  260.  
  261.     suba.l    #1,A2                ;correct index (1st item = 0)
  262.     adda.l    A1,A1                ;A1*2; table has word entries
  263.     adda.l    A2,A2                ;A2*2; table has word entries
  264.     
  265. ; Now calculate address to jump to by using the values in
  266. ; the offset tables.
  267.     lea        MenuTable,A0
  268.     adda.l    A0,A1                ;this gives in A1 the address of 
  269.                                     ;correct offset in MenuTable
  270.     adda.w    (A1),A0                ;A0 now contains the address 
  271.                                     ;of the correct ItemTable
  272.     adda.l    A0,A2                ;get correct entry in ItemTable
  273.     adda.w    (A2),A0                ;add offset at this entry to 
  274.                                     ;address of ItemTable
  275.     jmp        (A0)                ;and jump to it!
  276.     
  277. ; Offset table for each menu.    
  278. MenuTable    
  279.     DATAREFS    RELATIVE
  280.     dc.w    FileMTable-MenuTable
  281.     dc.w    EditMTable-MenuTable        ;in system window
  282.     dc.w    SCSIMTable-MenuTable        ;in contents region
  283.  
  284. ; ItemTables
  285. ; Offset table for each item in each menu.
  286. FileMTable
  287.     dc.w    QuitProc-FileMTable
  288. EditMTable
  289.     dc.w    UndoMI-EditMTable
  290.     dc.w    0
  291.     dc.w    CutMI-EditMTable
  292.     dc.w    CopyMI-EditMTable
  293.     dc.w    PasteMI-EditMTable
  294.     dc.w    ClearMI-EditMTable
  295.  
  296. SCSIMTable
  297.     dc.w    SelAddrProc-SCSIMTable
  298.     dc.w    ParamProc-SCSIMTable
  299.     dc.w    EDefectProc-SCSIMTable
  300.     dc.w    FormatProc-SCSIMTable
  301.     dc.w    ResetProc-SCSIMTable
  302.     
  303.     ENDPROC
  304.  
  305. ;PROC SysProc
  306. ;
  307. ; Mouse down in a desk accessory.  Go call _SystemClick.
  308. SysProc        PROC    ENTRY
  309.     IMPORT    (EventLoop):CODE
  310.     
  311.     pea        EventRec(A5)    
  312.     move.l    Window(A5),-(A7)
  313.     _SystemClick
  314.     jmp        EventLoop
  315.     ENDPROC
  316.     
  317. ;PROC QuitProc
  318. ;
  319. ; Procedure for quitting program.
  320. QuitProc    PROC    ENTRY
  321.  
  322.     _ExitToShell
  323.     ENDPROC
  324.  
  325. ;PROC UndoMI
  326. ;
  327. ; Procedure to handle selection of the "Undo" menu item when a
  328. ; desk accessory controls the active window.
  329. UndoMI    PROC    ENTRY
  330.     clr.w    -(A7)
  331.     move.w    #0,-(A7)
  332.     _SysEdit
  333.     adda.l    #2,A7
  334.     jmp        EventLoop
  335.     ENDPROC
  336.  
  337. ;PROC CutMI
  338. ;
  339. ; Procedure to handle selection of the "Cut" menu item when a
  340. ; desk accessory controls the active window.
  341. CutMI    PROC    ENTRY
  342.     clr.w    -(A7)
  343.     move.w    #2,-(A7)
  344.     _SysEdit
  345.     move.w    (A7)+,D0
  346.     jmp        EventLoop
  347.     ENDPROC
  348.  
  349. ;PROC CopyMI
  350. ;
  351. ; Procedure to handle selection of the "Copy" menu item when a
  352. ; desk accessory controls the active window.
  353. CopyMI    PROC    ENTRY
  354.     clr.w    -(A7)
  355.     move.w    #3,-(A7)
  356.     _SysEdit
  357.     move.w    (A7)+,D0
  358.     jmp        EventLoop
  359.     ENDPROC
  360.  
  361. ;PROC PasteMI
  362. ;
  363. ; Procedure to handle selection of the "Paste" menu item when a
  364. ; desk accessory controls the active window.
  365. PasteMI    PROC    ENTRY
  366.     clr.w    -(A7)
  367.     move.w    #4,-(A7)
  368.     _SysEdit
  369.     move.w    (A7)+,D0
  370.     jmp        EventLoop
  371.     ENDPROC
  372.  
  373. ;PROC ClearMI
  374. ;
  375. ; Procedure to handle selection of the "Clear" menu item when a
  376. ; desk accessory controls the active window.
  377. ClearMI    PROC    ENTRY
  378.     clr.w    -(A7)
  379.     move.w    #5,-(A7)
  380.     _SysEdit
  381.     move.w    (A7)+,D0
  382.     jmp        EventLoop
  383.     ENDPROC
  384.  
  385. ; PROC AppleMProc
  386. ;
  387. ; This procedure handles menu events in the Apple menu. On 
  388. ; entry, A2 has the item number of the menu item that was 
  389. ; selected.
  390.  
  391. AppleMProc    PROC    ENTRY
  392.     IMPORT    (DAName,QuickDraw):DATA
  393.     IMPORT    (AboutProc,EventLoop):CODE
  394.     
  395.     cmpa.l    #AboutItem,A2        ;"About U2 Formatter" selected?
  396.     beq        AboutProc            ;yes, go put up dialog
  397.  
  398. ; A desk accessory was selected, go instal it.    
  399.     move.l    QuickDraw.thePort(A5),MyPort(A5)    ;save our port
  400.     move.l    AppleMH(A5),-(A7)    ;push handle for apple menu
  401.     move.w    A2,-(A7)            ;push item number hit
  402.     pea        DAName(A5)            ;push space for DA name
  403.     _GetItem                    ;get DA name
  404.  
  405.     clr.w    -(A7)                ;space for driver reference #
  406.     pea        DAName(A5)            ;pass DA name
  407.     _OpenDeskAcc                ;open DA
  408.     adda.l    #2,A7
  409.     
  410.     move.l    MyPort(A5),-(A7)    ;restore our port
  411.     _SetPort
  412.     jmp        EventLoop            
  413.     ENDPROC
  414.  
  415. ; PROC    AboutProc
  416. ;
  417. ; This procedure puts up our about U2 Formatter dialog box.
  418. AboutProc    PROC    ENTRY
  419.     IMPORT    (ButtonHit,QuickDraw):DATA
  420.     IMPORT    (EventLoop,DefButton):CODE
  421.     
  422.     clr.l    -(A7)                ;space for pointer to dialog
  423.     move.w    #AboutRN,-(A7)        ;About dialog resource number
  424.     pea        DialogBuff(A5)        ;pass address of dialog buffer
  425.     move.l    #-1,-(A7)            ;bring dialog window to front
  426.     _GetNewDialog
  427.  
  428.  
  429.     move.l    (A7),DialogPort(A5)    ;Save pointer to dialog rec
  430.                                     ;note: pointer still left on
  431.                                     ;stack for _SetPort trap
  432.     _SetPort
  433.     lea        DialogBuff(A5),A4    ;pass address of dialog buffer
  434.     jsr        DefButton
  435.  
  436. NotYet
  437.     clr.l    -(A7)                ;use standard filter proc
  438.     pea        ButtonHit(A5)        ;address of storage for item hit
  439.     _ModalDialog                
  440.     cmpi.w    #1,ButtonHit(A5)    ;which item hit? is it "ok"?
  441.     bne        NotYet                ;no so loop back
  442.     
  443.     move.l    DialogPort(A5),-(A7)    ;pass pointer to dialog rec
  444.     _CloseDialog                
  445.     jmp        EventLoop
  446.     
  447.     ENDPROC
  448.     
  449. ; PROC DefButton
  450. ;
  451. ; This procedure draws a rounded rectangle around our default 
  452. ; button in a modal dialog.  It gets passed the address of our 
  453. ; dialog.  It then gets the rectangle for the first item and 
  454. ; draws a rounded rectangle around it.
  455.  
  456. DefButton    PROC    EXPORT
  457.     movem.l    D0-D2/A0-A4,-(A7)    ;save registers
  458.  
  459. ; First we get the rectangle for item 1.    
  460.     move.l    A4,-(A7)            ;push pointer for dialog
  461.     move.w    #1,-(A7)            ;push item number
  462.     pea        ItemType(A5)        ;address of space for item type
  463.     pea        ItemHandle(A5)        ;address of space for handle
  464.     pea        ItemRect(A5)        ;address of space for rectangle
  465.     _getDItem
  466.  
  467.  
  468.     move.w    #3,-(A7)        ;change pensize to 3X3
  469.     move.w    #3,-(A7)
  470.     _PenSize
  471.     
  472.     pea        ItemRect(A5)    ;make button smaller; all edges 
  473.     move.w    #-4,-(A7)            ;moved in by 4 pixels
  474.     move.w    #-4,-(A7)
  475.     _InsetRect
  476.     
  477.     pea        ItemRect(A5)    ;draw boarder for default button
  478.     move.w    #16,-(A7)        ;curvature is 16 pixel in both 
  479.     move.w    #16,-(A7)            ;directions
  480.     _FrameRoundRect
  481.     
  482. Done
  483.     movem.l    (A7)+,D0-D2/A0-A4    ;restore registers
  484.     rts
  485.     
  486.     ENDPROC
  487.     
  488. ; PROC RadioHiLite
  489. ;
  490. ; This procedure selects the radio button that was chosen and 
  491. ; deselects the radio button that was previously selected.  It 
  492. ; receives the old selected button in D0 and the new one in
  493. ; D1.  It also receives the address of the dialog buffer in A4
  494. ; If this is the first time the procedure is being called 
  495. ; for a given dialog box, it should be passed zero in D0 so that
  496. ; it doesn't try to deselect a radio button that is not selected.
  497. ; This procedure also checks to see that the button that was 
  498. ; chosen was not the one that was already selected.  If it is,
  499. ; it doesn't deselect it.
  500.  
  501. RadioHiLite    PROC    EXPORT
  502.     movem.l    D0-D2/D6-D7/A0-A4,-(A7)        ;save registers
  503.     
  504.     move.w    D0,D6            ;move radio button values to register
  505.     move.w    D1,D7                ;that wont be trashed by traps
  506.     
  507.     move.l    A4,-(A7)        ;get rectangle for radio button
  508.     move.w    D7,-(A7)
  509.     pea        ItemType(A5)
  510.     pea        ItemHandle(A5)
  511.     pea        ItemRect(A5)
  512.     _getDItem
  513.  
  514. ; Duplicate top left hand point of rectangle into bottom right
  515. ; point of rectangle.  They are now the same.  Now add a 
  516. ; different constantto each so that the circle in this rectangle
  517. ; is right in the middle of the radio button.  Then invert this 
  518. ; oval so it changes from white to black.
  519.     move.l    ItemRect(A5),ItemRect+4(A5)
  520.     addi.l    #$00070005,ItemRect(A5)
  521.     addi.l    #$000D000B,ItemRect+4(A5)
  522.     pea        ItemRect(A5)
  523.     _InvertOval    
  524.     
  525.     cmp.l    D6,D7        ;is the radio button the same one that
  526.     beq        Done            ;was highlighted last time? If so,
  527.                             ;we are done.
  528.     
  529.     tst.l    D6            ;is this the first time called?
  530.     beq        Done            ;if so, D6=0 and we must quit
  531.  
  532. ; Repeat the opporation for the old radio button, the one that 
  533. ; was previously highlighted.  This time _InvertOval will change
  534. ; it from black to white.
  535.     move.l    A4,-(A7)
  536.     move.w    D6,-(A7)
  537.     pea        ItemType(A5)
  538.     pea        ItemHandle(A5)
  539.     pea        ItemRect(A5)
  540.     _getDItem
  541.     move.l    ItemRect(A5),ItemRect+4(A5)
  542.     addi.l    #$00070005,ItemRect(A5)
  543.     addi.l    #$000D000B,ItemRect+4(A5)
  544.     pea        ItemRect(A5)
  545.     _InvertOval    
  546.  
  547. Done
  548.     movem.l    (A7)+,D0-D2/D6-D7/A0-A4    ;restore registers
  549.     rts
  550.     
  551.     ENDPROC
  552.  
  553. ; PROC ErrorProc
  554. ;
  555. ; This procedure puts up an error dialog box. The dialog tells
  556. ; what the last SCSI command or trap was, what error occure and a
  557. ; possible explanation.  All text is in STR resources. Trap names
  558. ; are given the resource number: "AX00" where X is the routine 
  559. ; selector used by the SCSI Manager (IM, IV-295). SCSI commands 
  560. ; are given the resource number: "X00" where X is the SCSI op
  561. ; code.  These values are all in the FormatEqu.a file. Resource
  562. ; number for errors are of the form "AAXX" for traps where XX is 
  563. ; the OSErr returned from the trap, or "10XX" for SCSI commands,
  564. ; where XX is the SCSI error reported by _SCSIComplete in the 
  565. ; status parameter. Resource numbers for the "Most Probable
  566. ; Cause" strings are "BAXX" for traps and "20XX" for SCSI 
  567. ; commands.
  568.  
  569. ErrorProc    PROC    EXPORT
  570.     IMPORT    (Last_Cmd,Res,CompStat,CompMsg):DATA
  571.     
  572. ; Get resource number for last command string and place a pointer
  573. ; to the string on the stack.
  574.     clr.l    D4                ;place number for last command in D4
  575.     move.w    Last_Cmd(A5),D4
  576.     lsl.l    #8,D4            ;multipy by $100.
  577.     clr.l    -(A7)            ;space for handle
  578.     move.l    #'STR ',-(A7)    ;type of resource
  579.     move.w    D4,-(A7)        ;resource number
  580.     _GetResource            ;get handle for last command string
  581.     move.l    (A7)+,A0        ;pop handle into A0
  582.     move.l    (A0),-(A7)        ;dereference handle and push pointer
  583.  
  584. ; Get resource number for error string and place a pointer to the
  585. ; string on the stack.    
  586.     clr.l    D3
  587.     move.w    Res(A5),D3        ;if there was no OSError, Res=0
  588.     bne        ErrorInTrap        ;if Res = 0, error in SCSI command
  589.     move.w    CompStat(A5),D3    ;SCSI error into D3
  590.     add.w    #$1000,D3        ;add offset for SCSI command error
  591.     bra.s    Continue
  592. ErrorInTrap
  593.     add.w    #$AA00,D3        ;add offset for trap error (OSError)
  594. Continue
  595.     clr.l    -(A7)            ;space for handle
  596.     move.l    #'STR ',-(A7)    ;type of resource
  597.     move.w    D3,-(A7)        ;resource number
  598.     _GetResource            ;get resource handle
  599.     move.l    (A7)+,A0        ;pop handle into A0
  600.     move.l    (A0),-(A7)        ;dereference handle and push pointer
  601.  
  602. ; Get resource number for most probable cause string and place a 
  603. ; pointer to the string on the stack.    
  604.     add.l    #$1000,D3        ;add offset to error# to get cause#
  605.     clr.l    -(A7)            ;space for handle
  606.     move.l    #'STR ',-(A7)    ;type of resource
  607.     move.w    D3,-(A7)        ;resource number
  608.     _GetResource            ;get resource handle
  609.     move.l    (A7)+,A0        ;pop handle into A0
  610.     move.l    (A0),-(A7)        ;dereference handle and push pointer
  611.     
  612.     clr.b    StrBuff4(A5)    ;make last string empty
  613.     pea        StrBuff4(A5)    ;pass pointer to empty string
  614.     _ParamText        
  615.     move.w    #133,-(A7)        ;resource number for dialog
  616.     clr.l    -(A7)            ;use standard filter proc function
  617.     _NoteAlert
  618.     
  619.     jmp    EventLoop            ;return to the event loop
  620.     ENDPROC
  621.  
  622. ; PROC CountOff
  623. ;
  624. ; This procedure produces a delay equal to the number of ticks
  625. ; in the long word passed in D0.
  626.  
  627. CountOff    PROC    EXPORT
  628.     movem.l    D0-D3/A0-A1,-(A7)    ;save the registers
  629.     
  630.     move.l    D0,D3            ;move our value into a register that
  631.                                 ;wont be trashed by the traps
  632.     clr.l    -(A7)            ;space for the current tick count
  633.     _TickCount                
  634.     add.l    (A7)+,D3        ;add our delay to the current tick
  635.                                 ;count, this is when we stop 
  636.                                 ;waiting.
  637.                                 
  638. ; Our loop to see if we have gone past the tick count we are 
  639. ; waiting for.
  640. NotYet
  641.     clr.l    -(A7)        ;space for number of ticks since reboot
  642.     _TickCount
  643.     cmp.l    (A7)+,D3    ;is this as big as the number we are 
  644.                             ;waiting for?
  645.     bgt     NotYet        ;if not, then repeat loop
  646.     
  647.     movem.l    (A7)+,D0-D3/A0-A1    ;restore registers
  648.     rts
  649.     ENDPROC
  650.     
  651.     
  652. ; PROC UnHiLite
  653. ;
  654. ; This procedure unhighlights an item in a dialog box to show
  655. ; that it cannot be selected.  It receives the address of the 
  656. ; dialog record in A4 and the item number to be unhighlighted in
  657. ; D0.
  658.  
  659. UnHiLite    PROC    EXPORT
  660.     movem.l    D0-D2/A0-A1,-(A7)    ;save the registers
  661.     
  662.     move.l    A4,-(A7)            ;get the item rect for the item
  663.     move.w    D0,-(A7)                ;number that we were passed
  664.     pea        ItemType(A5)
  665.     pea        ItemHandle(A5)
  666.     pea        ItemRect(A5)
  667.     _getDItem
  668.     
  669.     move.l    ItemHandle(A5),-(A7)    ;pass the item handle
  670.     move.w    #255,-(A7)                ;pass flag for unhighlighting
  671.     _HiLiteControl
  672.     
  673.     movem.l    (A7)+,D0-D2/A0-A1    ;restore registers
  674.     rts
  675.     ENDPROC
  676.  
  677. ; PROC ExtractNumb
  678. ;
  679. ; This procedure extracts the number value from an edit text item
  680. ; in a dialog box.  It gets passed the item number in D0 and the 
  681. ; address of the Dialog box record in A4.  A3 contains a pointer
  682. ; to the long where output is to be placed and D3 contains the 
  683. ; maximum value allowable.
  684.  
  685. ExtractNumb        PROC    EXPORT
  686.     movem.l    D0-D2/A0-A1,-(A7)    ;save registers
  687.     
  688.     clr.l    (A3)                ;clear output long
  689.  
  690. ; Get the handle for this item number.
  691.     move.l    A4,-(A7)            ;pass dialog record pointer
  692.     move.w    D0,-(A7)            ;pass item number
  693.     pea        ItemType(A5)
  694.     pea        ItemHandle(A5)
  695.     pea        ItemRect(A5)
  696.     _getDItem
  697.     
  698. ; Get the text from that dialog item.  Move text into StrBuff1.
  699.     move.l    ItemHandle(A5),-(A7)
  700.     pea        StrBuff1(A5)
  701.     _GetIText
  702.     
  703.     clr.l    D0                    ;get length of text out of first
  704.     move.b    StrBuff1(A5),D0            ;byte and place it in D0
  705.     ble        Exit                ;if length is 0, we are done.
  706.  
  707. ; Loop to remove all characters that aren't numbers. D1 is the
  708. ; index for the position being tested. D2 is the index for the 
  709. ; last valid position.
  710.     lea        StrBuff1(A5),A0        ;initialize A0 to point to string
  711.     moveq.l    #1,D1
  712.     moveq.l    #1,D2
  713.     
  714. Loop:    
  715.     cmp.b    #'0',(A0,D1.w)        ;test next character
  716.     blt        NotNumb        
  717.     cmp.b    #'9',(A0,D1.w)
  718.     bgt        NotNumb
  719.     
  720.     cmp.l    D1,D2                ;if indeces are same, no move is
  721.     beq        NoMove                    ;necessary
  722.     move.b    (A0,D1.w),(A0,D2.w)    ;move character
  723.     
  724. NoMove:
  725.     addq.l    #1,D1                ;increment both pointers as last
  726.     addq.l    #1,D2                    ;character was a number
  727.     cmp.w    D1,D0                ;reached the end of string?
  728.     bge        Loop                ;no
  729.     bra        Convert                ;yes
  730.     
  731. NotNumb
  732.     addq.w    #1,D1                ;only increment test pointer
  733.     cmp.w    D1,D0                ;reached the end of string?
  734.     bge        Loop                ;no
  735.     bra        Convert                ;yes
  736.     
  737. Convert:
  738.     subq.l    #1,D2                ;make D2 into count byte 
  739.     move.b    D2,(A0)                ;count byte into byte 1 of string
  740.     _StringToNum                ;convert to hex value
  741.     move.l    D0,(A3)                ;move result to output
  742.     
  743. Default
  744.     cmp.l    (A3),D3                ;is result greater than allowable
  745.     bge        Exit                ;no, we can exit
  746.     move.l    D3,(A3)                ;yes so use default value instead
  747.  
  748. Exit
  749.     movem.l    (A7)+,D0-D2/A0-A1    ;restore registers
  750.     rts
  751.     ENDPROC
  752.     
  753.     END
  754.